package com.epoint.rocketmq;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

/**
 * Created by wangchao on 2017/11/7.
 */
public class PushConsumer {
    /**
     * 当前例子是PushConsumer用法，使用方式给用户感觉是消息从RocketMQ服务器推到了应用客户端。<br>
     * 但是实际PushConsumer内部是使用长轮询Pull方式从MetaQ服务器拉消息，然后再回调用户Listener方法<br>
     */
    public static void main(String[] args) throws InterruptedException,MQClientException {
        /**
         * 一个应用创建一个Consumer，由应用来维护此对象，可以设置为全局对象或者单例<br>
         * 注意：ConsumerGroupName需要由应用来保证唯一
         */
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(
                "ConsumerGroupName");
        consumer.setNamesrvAddr("192.168.77.128:9876");
        consumer.setInstanceName("Consumber");
        /**
         * 设置consumer第一次启动是从队列到头部开始消费还是队列尾部开始消费
         * 如果非第一次启动，那么按照上次消费的位置继续消费
         */
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        /**
         * 订阅指定topic下tags分别等于TagA或TagC或TagD
         */
        //consumer.subscribe("TopicTest1", "TagA || TagC || TagD");
        //consumer.subscribe("TopicTest1","*");
        /**
         * 订阅指定topic下所有消息<br>
         * 注意：一个consumer对象可以订阅多个topic
         */
        consumer.subscribe("TopicTest1", "*");

        consumer.setConsumeThreadMin(10);

        consumer.registerMessageListener(new MessageListenerConcurrently() {

            /**
             * 默认msgs里只有一条消息，可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
             */
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs.size());

//                MessageExt msg = msgs.get(0);
//                if (msg.getTopic().equals("TopicTest1")) {
//                    // 执行TopicTest1的消费逻辑
//                    if (msg.getTags() != null && msg.getTags().equals("TagA")) {
//                        // 执行TagA的消费
//                        System.out.println(new String(msg.getBody()));
//                    } else if (msg.getTags() != null
//                            && msg.getTags().equals("TagC")) {
//                        // 执行TagC的消费
//                    } else if (msg.getTags() != null
//                            && msg.getTags().equals("TagD")) {
//                        // 执行TagD的消费
//                    }
//                } else if (msg.getTopic().equals("TopicTest2")) {
//                    System.out.println(new String(msg.getBody()));
//                }else if (msg.getTopic().equals("TopicTest3")) {
//                    System.out.println(new String(msg.getBody()));
//                }
                try {
                    for (MessageExt msg : msgs) {
                        String topic = msg.getTopic();
                        String msgBody = new String(msg.getBody(), "utf-8");
                        String tags=msg.getTags();
                        System.out.println("收到消息"+" topic :"+ topic +",tags:"+tags+", msg :" +msgBody);
                    }
                }catch(Exception e){
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }

                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        /**
         * Consumer对象在使用之前必须要调用start初始化，初始化一次即可<br>
         */
        consumer.start();

        System.out.println("Consumer Started.");
    }
}